#ifndef __PLAN_DE_CARRERA_H__
#define __PLAN_DE_CARRERA_H__

#include "PeriodoCursada.h"
#include "ActualizadorPantallaCommand.h"
#include "ContextoDeEjecucion.h"

using namespace controlador;

namespace modelo {

	class PlanDeCarrera 
	{
	public:
		PlanDeCarrera(list<MateriaPriorizada*> materiasSueltas, ContextoDeEjecucion* contexto);
		~PlanDeCarrera(void);

		void BuscarYEncolarMateriaAlPrincipio(string codigoOptativa);;
		void BuscarYEncolarMateriaAlFinal(string codigoOptativa);
		void ConstruirPeriodosBajoRestriccionesProcesadas(ActualizadorPantallaCommand* actualizadorPantalla);

		/** Accesibilidad */
		ContextoDeEjecucion* GetContexto() {return contexto;}
		list<PeriodoCursada*> GetPeriodosDeCursada() {return periodosDeCursada;}
		void GetPeriodosDeCursada(list<PeriodoCursada*> otrosPeriodos) {periodosDeCursada = otrosPeriodos;}

	private:
		ContextoDeEjecucion* contexto;
		list<PeriodoCursada*> periodosDeCursada;
		list<MateriaPriorizada*> materiasSueltas;
		list<MateriaPriorizada*> materiasOptativasAgregadasAlPlan;
		int iteracion;

		void AgregarMateriaAlPeriodo(MateriaPriorizada* proximaMateria, PeriodoCursada* periodoActual);
		MateriaPriorizada* BuscarMateriaYPosicionEnLista(string codigo, int* indice);
		bool CorrelativasCursadasEnPeriodosAnteriores(PeriodoCursada* periodoActual, MateriaPriorizada* materia);
		bool CumpleRequisitoDeDificultad(PeriodoCursada* periodoActual, MateriaPriorizada* materia);
		PeriodoCursada* CrearYAgregarNuevoPeriodo();
		void EncolarMateria(MateriaPriorizada* materia);
		bool HayLugarEnPeriodoPara(PeriodoCursada* periodoActual, MateriaPriorizada* proximaMateria, ActualizadorPantallaCommand* actualizadorPantalla);
		bool HayLugarEnPeriodoPara(PeriodoCursada* periodo, MateriaPriorizada* materia, CatedraMateria* catedra);
		MateriaPriorizada* ObtenerProximaMateria();
		PeriodoCursada* ObtenerProximoPeriodoLibre(MateriaPriorizada* materia, int *indice, bool *avanzarSiguienteMateria);
		bool PlanCompleto();
		bool PlanAdmiteMasOptativas();
	};
}
#endif